package com.example.cloud.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.example.cloud.model.system.Menu;
import com.example.cloud.model.system.Organ;
import org.apache.commons.lang.StringUtils;

import java.util.List;

import static java.util.Comparator.comparing;
import static java.util.stream.Collectors.toList;

/**
 * Created by wangtao on 2018/3/4.
 */
public class TreeUtil {

    /**
     * 构建菜单树
     * @param menus
     * @param type 1：加载菜单 null：全部加载
     * @return
     */
    public static JSONArray buildMenuTree(List<Menu> menus, Integer type) {
        // 先找到所有的根节点
        List<Menu> list = menus.stream().filter((Menu menu) -> menu.getParentId() == null).collect(toList());
        // 菜单排序
        list.sort(comparing(Menu::getSort));
        // 为父级菜单设置子菜单，递归调用getChild
        list.stream().forEach(menu -> menu.setChildren(getChildByMenu(menu.getId(), menus, type)));
        return JSON.parseArray(JSON.toJSONString(list));
    }

    /**
     * 递归检索子节点
     * @param parentId
     * @param menus
     * @param type
     * @return
     */
    private static List<Menu> getChildByMenu(Long parentId, List<Menu> menus, Integer type) {
        // 子节点集合
        List<Menu> list = menus.stream().filter((Menu menu) -> {
            if (type != null) {
                return menu.getType() == type.intValue() && parentId.equals(menu.getParentId());
            } else {
                return parentId.equals(menu.getParentId());
            }
        }).collect(toList());
        // 遍历子节点集合
        list.stream().forEach(menu -> {
            // 当前节点如果还有子节点，递归加载
            if((type != null && StringUtils.isBlank(menu.getPath()))
                    || (type == null && StringUtils.isNotBlank(menu.getPath()))){
                menu.setChildren(getChildByMenu(menu.getId(), menus, type));
            }
        });
        // 菜单排序
        list.sort(comparing(Menu::getSort));
        return list;
    }

    /**
     * 构建组织机构树
     * @param organs
     * @return
     */
    public static JSONArray buildOrganTree(List<Organ> organs){
        // 先找到所有的根节点
        List<Organ> list = organs.stream().filter((Organ organ) -> organ.getParentId() == null).collect(toList());
        // 排序
        list.sort(comparing(Organ::getOrganName));
        // 遍历子节点
        list.stream().forEach(organ -> organ.setChildren(getChildByOrgan(organ.getId(), organs)));
        return JSON.parseArray(JSON.toJSONString(list));
    }

    private static List<Organ> getChildByOrgan(Long parentId, List<Organ> organs) {
        // 子菜单
        List<Organ> list = organs.stream().filter((Organ organ) -> parentId.equals(organ.getParentId())).collect(toList());
        // 排序
        list.sort(comparing(Organ::getOrganName));
        // 子节点不为空继续遍历
        if (!list.isEmpty()) {
            // 把子菜单的子菜单再循环一遍
            list.stream().forEach(organ -> organ.setChildren(getChildByOrgan(organ.getId(), organs)));
        } else {
            // 递归退出
            return null;
        }
        return list;
    }
}
